package com.example.monotarr;


import java.util.ArrayList;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.graphics.drawable.ShapeDrawable;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class Main extends ListActivity {
	
	protected TextView title2;
	private TextView tv;
	protected TextView textO;
	protected TextView textOA;
	protected Button but;
	protected Button but2;
	protected Button but3;
	protected MyArrayAdapter dataAdapter;
	protected ListSQLiteHelper usdbh;
	private Cursor c;
	protected int lastID;
	protected String ordre;
	protected static float mida;
	protected String fet;
	protected AlertDialog alertDialog;
	protected AlertDialog ajuda;
	protected int altura, alturat;
	protected ShapeDrawable shapeD;
	protected boolean colorCanviat;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
		
				
		setContentView(R.layout.main);
		getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.barra_titol);

		title2 = (TextView) findViewById(R.id.title2);
		but = (Button) findViewById(R.id.buttont);
		but2 = (Button) findViewById(R.id.buttont2);
		but3 = (Button) findViewById(R.id.buttont3);
		
		
	
	
		
		// Actualitza llista
		actualitzaBD();
		
		
		// Detector moviments
		DetectorMoviment dm = new DetectorMoviment(this);
		RelativeLayout zonaMoviment = (RelativeLayout) findViewById(R.id.relativeLayout2);
		zonaMoviment.setOnTouchListener(dm);

		// Llista
		ListView list = getListView();
		list.setFastScrollEnabled(true);		
		registerForContextMenu(list);

		// Quant a
		alertDialog = new AlertDialog.Builder(this).create();
		alertDialog.setTitle("Quant a");
		alertDialog.setMessage("Monotarr 1.0 - Marc Molins");
		alertDialog.setButton("Acceptar", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				return;
			}
		});
		
		
		// Ajuda
		ajuda = new AlertDialog.Builder(this).create();
		ajuda.setButton("Acceptar", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				return;
			}
		});
		
		// Butons superiors
		tv = (TextView) findViewById(R.id.textS);		
		if (fet.equals("tot")) {
			tv.setText("TOTES LES TASQUES");
			but3.setEnabled(false);
		}
		else if (fet.equals("fetes")) {
			tv.setText("TASQUES FETES");
			but2.setEnabled(false);
		}
		else if (fet.equals("nofetes")) {
			tv.setText("TASQUES NO FETES");
			but.setEnabled(false);
		}
		
		// Text Ordre
		textO = (TextView) findViewById(R.id.textAm);
		textOA = (TextView) findViewById(R.id.textOA);				
		if (ordre.equals("id")) {
			textO.setText("↑Ordena segons prioritat↑");
			textOA.setText("ORDRE ACUTAL: ADDICIÓ");
			
		} 
		else if (ordre.equals("prioritat, id")) {
			textO.setText("↑Ordena cronològicament↑");
			textOA.setText("ORDRE ACUTAL: PRIORITAT");

		} 
		else if (ordre.equals("any, mes, dia, hora, minut, id")) {
			textO.setText("↑Ordena segons addició↑");
			textOA.setText("ORDRE ACUTAL: CRONOLÒGIC");

		}

	    RelativeLayout layout = (RelativeLayout) findViewById(R.id.l_dalt);
	    RelativeLayout layout2 = (RelativeLayout) findViewById(R.id.relativeLayout2);
	    LinearLayout layout3 = (LinearLayout) findViewById(R.id.relativeLayout2pre);
	    
	    layout.setBackgroundColor(Color.parseColor("#35A1A1"));
	    layout2.setBackgroundColor(Color.parseColor("#35A1A1"));
	    layout3.setBackgroundColor(Color.parseColor("#35A1A1"));

	    
	    
		
		
		
	}// FI ON CREATE

	
   
	/* colors
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {

    	altura = findViewById(R.id.mainM).getHeight();
    	alturat = findViewById(R.id.barraTitol).getHeight();
    	Log.v("ALTURA LL", altura+"  -  "+alturat);
	}
	
	
	
	private void calculaALT() {
        new Thread() {    
            public void run() {
            	findViewById(R.id.mainM).post(new Runnable(){
            	   public void run(){

            	   }
               	});
            }
        }.start();
	}
	 */

	// Menu long click
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
		
		if (v.getId() == android.R.id.list) {
			AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
			Struct o = (Struct) getListAdapter().getItem(info.position);
			menu.setHeaderTitle(o.titol);
			
			String aux;
			if (o.marcat == 0) aux = "Fet!";
			else aux = "Desmarca";
			String[] menuItems = { "Edita", "Duplica", "Esborra", aux };
			for (int i = 0; i < menuItems.length; i++) menu.add(Menu.NONE, i, i, menuItems[i]);
		}		
	}

	
	// Selecció menu long click
	@Override
	public boolean onContextItemSelected(MenuItem item) {		
		
		AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
		int menuIndex = item.getItemId();
		Struct o = (Struct) getListAdapter().getItem(info.position);
		final int id2 = o.id;	
		
		if (menuIndex == 0) {
			finish();
			Intent intent = new Intent();
			intent.setClass(Main.this, EditaTasca.class);
			intent.putExtra("id", id2);
			intent.putExtra("mode", 0);
			startActivity(intent);
		} 
		else if (menuIndex == 1) {
			finish();
			Intent intent = new Intent();
			intent.setClass(Main.this, EditaTasca.class);
			intent.putExtra("id", id2);
			intent.putExtra("mode", -1);
			startActivity(intent);
			
		}
		else if (menuIndex == 2) {
			AlertDialog segur = new AlertDialog.Builder(this).create();
			segur.setTitle("Segur que vols esborrar la tasca?");

			segur.setButton("D'acord", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					esborraBD_id(id2);
					actualitzaBD();
					Toast.makeText(Main.this,
							"Tasca esborrada",
							Toast.LENGTH_SHORT).show();
					return;
				}
			});

			segur.setButton2("Cancel·la", new DialogInterface.OnClickListener() {
				public void onClick(DialogInterface dialog, int which) {
					return;
				}
			});
			segur.show();
			
		}
		else if (menuIndex == 3) {
			marca_id(id2);
			actualitzaBD();
		}
		return true;		
	}

	
	// click item
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		
		super.onListItemClick(l, v, position, id);
		Struct o = (Struct) this.getListAdapter().getItem(position);		
		int id2 = o.id;
		finish();
		Intent intent = new Intent();
		intent.setClass(Main.this, EditaTasca.class);
		intent.putExtra("id", id2);
		startActivity(intent);
	}

	
	// Modificar menu
	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {

		menu.removeItem(5);
		menu.removeItem(4);
		menu.removeItem(2);
		menu.removeItem(1);
		menu.removeItem(3);
		
		if (this.toString().indexOf("Preferencies") != -1) {			
			menu.add(0, 2, 0, "Afegir Tasca").setIcon(R.drawable.ic_menu_add);
			menu.add(0, 5, 0, "Ajuda").setIcon(R.drawable.ic_menu_help);
			//menu.add(0, 3, 0, "Quant a").setIcon(R.drawable.ic_menu_info_details);
			
		} 
		else if (this.toString().indexOf("AfegeixTasca") != -1) {			
			//menu.add(0, 1, 0, "Preferències").setIcon(R.drawable.ic_menu_preferences);
			menu.add(0, 5, 0, "Ajuda").setIcon(R.drawable.ic_menu_help);
			//menu.add(0, 3, 0, "Quant a").setIcon(R.drawable.ic_menu_info_details);
			
		} 
		else if (this.toString().indexOf("EditaTasca") != -1) {
			//menu.add(0, 2, 0, "Afegir Tasca").setIcon(R.drawable.ic_menu_add);
			//menu.add(0, 1, 0, "Preferències").setIcon(R.drawable.ic_menu_preferences);
			menu.add(0, 5, 0, "Ajuda").setIcon(R.drawable.ic_menu_help);
			//menu.add(0, 3, 0, "Quant a").setIcon(R.drawable.ic_menu_info_details);
			
		} 		
		else {			
			String s;
			
			if (ordre.equals("id"))	s = "Ordena segons prioritat";
			else if (ordre.equals("prioritat, id"))	s = "Ordena cronològicament";
			else s = "Ordena segons addició";

			menu.add(0, 4, 0, s).setIcon(R.drawable.ic_menu_refresh);
			menu.add(0, 2, 0, "Afegir Tasca").setIcon(R.drawable.ic_menu_add);
			menu.add(0, 1, 0, "Preferències").setIcon(R.drawable.ic_menu_preferences);
			menu.add(0, 5, 0, "Ajuda").setIcon(R.drawable.ic_menu_help);
			menu.add(0, 3, 0, "Quant a").setIcon(R.drawable.ic_menu_info_details);
			
		}	

		return true;
	}

	
	// Selecció menu
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
			case 1:
				showPreferences();
				return true;
			case 2:
				showAddTask();
				return true;
			case 3:
				alertDialog.show();
				return true;
			case 4:
				if (ordre.equals("id")) {
					ordre = "prioritat, id";
					canviaOrdreBD(ordre);
					textO.setText("↑Ordena cronològicament↑");
					textOA.setText("ORDRE ACUTAL: PRIORITAT");
				} 
				else if (ordre.equals("prioritat, id")) {
					ordre = "any, mes, dia, hora, minut, id";
					canviaOrdreBD(ordre);
					textO.setText("↑Ordena segons addició↑");
					textOA.setText("ORDRE ACUTAL: CRONOLÒGIC");
				} 
				else if (ordre.equals("any, mes, dia, hora, minut, id")) {
					ordre = "id";
					canviaOrdreBD(ordre);
					textO.setText("↑Ordena segons prioritat↑");
					textOA.setText("ORDRE ACUTAL: ADDICIÓ");
				}
	
				actualitzaBD();
				return true;
			case 5:
				
				
				if (this.toString().indexOf("Preferencies") != -1) {						
					ajuda.setTitle("Preferències");
					ajuda.setMessage("CANVI D'ORDRE: Pots canviar l'ordre en què es mostren les tasques. " +
							"Pots escollir entre \"ordre d'addició\" que les mostra segons l'ordre en que les has anat introduint," +
							" \"ordre segons prioritat\" que ho fa de prioriat alta a prioritat baixa" +
							" i \"ordre cronològic\" que les mostra en ordre de data. També es pot fer des de la pantalla principal.\n\n" +
							"CANVI MIDA TEXT: Pots canviar la mida del text de les tasques " +
							"del valor 10 (mida petita) al valor 30 (mida gran).\n\n" +
							"ESBORRA TASQUES: Pots esborrar totes les tasques fetes o directament totes les tasques" +
							" amb els seus respectius botons.");
					ajuda.show();					
					
				} 
				else if (this.toString().indexOf("AfegeixTasca") != -1) {			
					ajuda.setTitle("Afegint una tasca");
					ajuda.setMessage("TÍTOL: Afegeix un títol a la tasca (obligatori).\n\n" +
							"NOTES: Afegeix notes si vols tenir més informació.\n\n" +
							"PRIORITAT: Escull una prioritat. Per defecte es selecciona \"Alta\" (obligatori).\n\n" +
							"TEMPORALITAT: Pots afegir una data i una hora. Ha de ser posterior a l'instant de creació.");
					ajuda.show();					
					
					
				} 
				
				else if (this.toString().indexOf("EditaTasca") != -1) {			
					ajuda.setTitle("Editant/Duplicant una tasca");
					ajuda.setMessage("TÍTOL: Pots editar el títol de la tasca.\n\n" +
							"NOTES: Pots editar les notes de la tasca.\n\n" +
							"PRIORITAT: Pots canviar la prioritat de la tasca.\n\n" +
							"TEMPORALITAT: Pots afegir/editar/eliminar una data i una hora. Haurà de ser posterior a l'instant de modificació.\n\n" +
							"* Si et trobes editant una tasca també la podràs esborrar directament amb el seu botó corresponent.");
					ajuda.show();					
					
					
				} 		
				else {			
					ajuda.setTitle("Ajuda");
					ajuda.setMessage("La pantalla es divideix en 3 parts:" +
							" la part superior (on es controla la vista on som), la part central (on es mostren les notes) i la part inferior (una zona on es poden donar ordres lliscant o fent \"swipe\" amb el dit).\n\n" +
							"Hi ha 3 vistes diferents per mostrar les tasques:" +
							" totes, les que estiguin per fer i les que ja estan fetes. Per intercanviar de vista has de prémer els botons superiors.\n\n" +
							"Quan tinguis tasques es mostraran per pantalla en una llista a la part central. En fer un clic llarg sobre una d'elles apareix un menú contextual." +
							" Tenim les següents opcions a fer amb les tasques:\n\n" +
							"AFEGIR: Pots afegir una nova tasca lliscant a la dreta a la part inferior o bé en el menú.\n\n" +
							"MARCAR: Pots marcar una tasca com a feta amb el seu checkbox o bé en el menú contextual.\n\n" +
							"EDITAR: Pots editar una tasca clicant sobre ella o bé en el menú contextual.\n\n" +
							"DUPLICAR: Pots duplicar una tasca en el menú contextual.\n\n" +
							"ELIMINAR: Pots eliminar una tasca en el menú contextual.\n\n" +
							"A part d'això també podem:\n- Navegar a preferències (lliscant a l'esquerra a la part inferior o bé en el menú) " +
							"\n- Canviar l'ordre de les tasques (lliscant amunt o bé en el menú) \n- Canviar la mida de la lletra (lliscant en diagonal dreta-amunt per augmentar i " +
							"esquerra-avall per disminuir) \n- Sortir de l'aplicació (lliscant avall).");
					ajuda.show();					
					
				}	
				
				return true;
		}
		return false;
	}


	// Mostra Preferencies
	public void showPreferences() {
		finish();
		Intent intent = new Intent();
		intent.setClass(Main.this, Preferencies.class);
		startActivity(intent);
		//overridePendingTransition(R.anim.in_left,R.anim.out_up);
	}

	
	// Mostra Nova Tasca
	public void showAddTask() {
		finish();
		Intent intent = new Intent();
		intent.setClass(Main.this, AfegeixTasca.class);
		startActivity(intent);
	}

	
	// Canvia mida text
	public void canviar_mida(int mida) {
		usdbh = new ListSQLiteHelper(this, "DBList", null, 1);
		SQLiteDatabase db6 = usdbh.getWritableDatabase();
		db6.execSQL("UPDATE Mida SET mida = '" + mida + "'");
		db6.close();
	}

	
	// Canvia ordre BD
	public void canviaOrdreBD(String ordre) {
		usdbh = new ListSQLiteHelper(this, "DBList", null, 1);
		SQLiteDatabase db5 = usdbh.getWritableDatabase();
		db5.execSQL("UPDATE Ordre SET ordre = '" + ordre + "'");
		db5.close();
	}

	
	// Esborra tota la BD
	public void esborraBD() {
		usdbh = new ListSQLiteHelper(this, "DBList", null, 1);
		SQLiteDatabase db3 = usdbh.getWritableDatabase();
		db3.execSQL("DELETE FROM List;");
		db3.execSQL("UPDATE LastID SET lastid = 0");
		db3.close();
	}

	
	// Esborra fetes BD
	public void esborra_marcadesBD() {
		usdbh = new ListSQLiteHelper(this, "DBList", null, 1);
		SQLiteDatabase db9 = usdbh.getWritableDatabase();
		db9.execSQL("DELETE FROM List WHERE marcat = 1;");
		db9.close();
	}
	
	
	// Esborra una tasca BD
	public void esborraBD_id(int id) {
		usdbh = new ListSQLiteHelper(this, "DBList", null, 1);
		SQLiteDatabase db4 = usdbh.getWritableDatabase();
		db4.execSQL("DELETE FROM List WHERE id = '" + id + "';");
		db4.close();		
	}

	
	// Marca una tasca com a feta
	public void marca_id(int id2) {

		usdbh = new ListSQLiteHelper(this, "DBList", null, 1);
		SQLiteDatabase db2 = usdbh.getWritableDatabase();

		String[] camps = new String[] { "marcat" };
		Cursor aux;
		aux = db2.query("List", camps, id2 + " = id", null, null, null, null);
		aux.moveToFirst();
		int marcat = aux.getInt(0);

		aux.close();

		if (marcat == 0)
			marcat = 1;
		else if (marcat == 1)
			marcat = 0;

		db2.execSQL("UPDATE List SET marcat = " + marcat + " WHERE id = " + id2);
		db2.close();
		
	}
	
	

	//actualitza dades i llista
	public void actualitzaBD() {

		usdbh = new ListSQLiteHelper(this, "DBList", null, 1);
		SQLiteDatabase db = usdbh.getReadableDatabase();

		String[] li = new String[] { "lastid" };
		Cursor aux;
		aux = db.query("LastID", li, null, null, null, null, null);
		aux.moveToFirst();
		lastID = aux.getInt(0);
		aux.close();

		String[] camp = new String[] { "ordre" };
		Cursor aux2;
		aux2 = db.query("Ordre", camp, null, null, null, null, null);
		aux2.moveToFirst();
		ordre = aux2.getString(0);
		aux2.close();

		String[] camp2 = new String[] { "mida" };
		Cursor aux3;
		aux3 = db.query("Mida", camp2, null, null, null, null, null);
		aux3.moveToFirst();
		mida = (float) aux3.getInt(0);
		aux3.close();
		
		String[] camp4 = new String[] { "fet" };
		Cursor aux4;
		aux4 = db.query("Fet", camp4, null, null, null, null, null);
		aux4.moveToFirst();
		fet = aux4.getString(0);
		aux4.close();
		
		final ArrayList<Struct> data = new ArrayList<Struct>();
		dataAdapter = new MyArrayAdapter(this, data, fet);
		setListAdapter(dataAdapter);

		if (db != null) {
			
			TextView no_notes = (TextView) findViewById(R.id.text);

			String[] camps = new String[] { "id", "titol", "notes",
					"prioritat", "dia", "mes", "any", "hora", "minut", "marcat" };
			c = db.query("List", camps, null, null, null, null, ordre);

			if (c.moveToFirst()) {
				Struct st = new Struct();
				st.id = c.getInt(0);
				st.titol = c.getString(1);
				st.notes = c.getString(2);
				st.prioritat = c.getInt(3);
				st.dia = c.getInt(4);
				st.mes = c.getInt(5);
				st.any = c.getInt(6);
				st.hora = c.getInt(7);
				st.minut = c.getInt(8);
				st.marcat = c.getInt(9);
				if (fet.equals("tot")) data.add(st);
				else if (fet.equals("fetes") && st.marcat == 1) data.add(st);
				else if (fet.equals("nofetes") && st.marcat == 0) data.add(st);
				
				while (c.moveToNext()) {
					Struct st2 = new Struct();
					st2.id = c.getInt(0);
					st2.titol = c.getString(1);
					st2.notes = c.getString(2);
					st2.prioritat = c.getInt(3);
					st2.dia = c.getInt(4);
					st2.mes = c.getInt(5);
					st2.any = c.getInt(6);
					st2.hora = c.getInt(7);
					st2.minut = c.getInt(8);
					st2.marcat = c.getInt(9);
					if (fet.equals("tot")) data.add(st2);
					else if (fet.equals("fetes") && st2.marcat == 1) data.add(st2);
					else if (fet.equals("nofetes") && st2.marcat == 0) data.add(st2);

				}
				
				if (data.size() == 0) {
					String ss = "";
					if (fet.equals("tot")) ;
					else if (fet.equals("fetes")) ss = " fetes";
					else if (fet.equals("nofetes")) ss = " no fetes";
					
					
					
					no_notes.setText("No hi ha tasques"+ss);
					no_notes.setTextSize(mida);
				}
				else no_notes.setText("");
			} else {
				String ss = "";
				if (fet.equals("tot")) ;
				else if (fet.equals("fetes")) ss = " fetes";
				else if (fet.equals("nofetes")) ss = " no fetes";
				
				
				
				no_notes.setText("No hi ha tasques"+ss);
				no_notes.setTextSize(mida);

			}

			c.close();
		}

		db.close();

	}	
	
	
	// canviar mostra DB
	public void canviaFet(String fet) {
		usdbh = new ListSQLiteHelper(this, "DBList", null, 1);
		SQLiteDatabase db99 = usdbh.getWritableDatabase();
		db99.execSQL("UPDATE Fet SET fet = '" + fet + "'");
		db99.close();
	}
	
	
	// botó no fetes
	public void nofetes(View view) {
    	switch (view.getId()) {
	    	case R.id.buttont:		    		
				fet = "nofetes";
				canviaFet(fet);
				tv.setText("TASQUES NO FETES");
				but.setEnabled(false);
				but2.setEnabled(true);
				but3.setEnabled(true);
				actualitzaBD();
	    		break;
    	}   	
	    	
	}

	
	// botó fetes
	public void fetes(View view) {
    	switch (view.getId()) {
	    	case R.id.buttont2:
				fet = "fetes";
				canviaFet(fet);
				tv.setText("TASQUES FETES");
				but2.setEnabled(false);
				but.setEnabled(true);
				but3.setEnabled(true);
		    	actualitzaBD();
		    	break;
    	}
	}
		 
	// botó totes
	public void tot(View view) {
    	switch (view.getId()) {
	    	case R.id.buttont3:
				fet = "tot";
				canviaFet(fet);
				tv.setText("TOTES LES TASQUES");
				but3.setEnabled(false);
				but2.setEnabled(true);
				but.setEnabled(true);
	    		actualitzaBD();		    		
	    		break;
    	}
	}
	
	
	/* colors
	@Override
	public void onWindowFocusChanged(boolean hasWindowsFocus) {
		
		if (hasWindowsFocus) {
			altura = findViewById(R.id.mainM).getHeight();
			alturat = findViewById(R.id.barraTitol).getHeight();
			Log.v("ALTURA LinearLayout", altura+"  -  "+alturat);
			
					
		    shapeD = new ShapeDrawable(new RectShape());	    
		    shapeD.getPaint().setShader(new LinearGradient(0, 0, 0, altura, Color.RED, Color.BLUE, Shader.TileMode.REPEAT));
			findViewById(R.id.mainM).setBackgroundDrawable(shapeD);
		}
		
	}
	*/

}